package com.jt.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

@RefreshScope
@RestController
public class ProviderCacheController {
    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/provider/cache")
    public String doUseLocalCache(){
        return "useLocalCache'value is   "+useLocalCache;
    }
    //CopyOnWriteArrayList<>()是线程安全集合
    private List<String> cache = new CopyOnWriteArrayList<>();
    @RequestMapping("/provider/cache1")
    public List<String> doUseLocalCache1(){
        if(!useLocalCache){//是否开启缓存机制
            //不开启直接从数据库拿
            System.out.println("get data from databases!");
            return Arrays.asList("A","B","C");
        }
        /**
         * 双重校验锁机制
         */
        if(cache.isEmpty()){//开启了缓存机制 判断内存中的缓存里是否为空
            //当线程第一次进来的时候为空
            //第二次进来的时候，因为在内存的缓存中已有数据，所以不需要执行一下代码，直接从缓存中拿
            synchronized (cache){//同步代码块保证查询时线程安全的作用
                if(cache.isEmpty()){
                    //如果为空从数据库拿到内存的缓存中
                    System.out.println("get data from databases!");
                    List<String> cates = Arrays.asList("A","B","C");
                    cache.addAll(cates);
                }
            }
        }
        return cache;
    }
}

